package com.fancy.user.service;

import cn.hutool.db.PageResult;
import com.fancy.common.dto.response.Result;
import com.fancy.imasclient.dto.*;
import com.fancy.user.dto.request.*;
import com.fancy.user.dto.response.*;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * 用户服务接口，提供用户相关的业务功能
 */
@Service
public interface UserService {
    /**
     * 用户注册
     *
     * @param dto 注册请求参数
     * @return 注册响应结果
     */
    Result<UserRegisterResponseVO> register(UserRegisterRequestDTO dto);

    /**
     * 用户登录
     *
     * @param dto 登录请求参数
     * @return 登录响应结果
     */
    Result<UserLoginResponseVO> login(UserLoginRequestDTO dto);
    
    /**
     * 获取用户详细信息
     *
     * @param userId 用户ID
     * @return 用户详细信息
     */
    Result<UserDetailVO> getUserInfo(Long userId);

    /**
     * 更新用户信息
     *
     * @param userId 用户ID
     * @param dto    更新请求参数
     * @return 更新结果
     */
    Result<Void> updateUserInfo(Long userId, UserUpdateRequestDTO dto);

    /**
     * 购买会员
     *
     * @param userId 用户ID
     * @param dto    购买请求参数
     * @return 购买响应结果
     */
    Result<MembershipPurchaseResponseVO> purchaseMembership(Long userId, MembershipPurchaseRequestDTO dto);

    /**
     * 获取用户收藏列表
     *
     * @param userId 用户ID
     * @param type   收藏类型（1:歌曲, 2:歌单, 3:专辑, 4:歌手）
     * @param page   页码
     * @param size   每页大小
     * @return 分页的收藏列表
     */
    Result<PageResult<UserCollectionResponseDTO>> getUserCollections(Long userId, Integer type, int page, int size);
    
    /**
     * 关注目标（用户或内容）
     *
     * @param userId 用户ID
     * @param dto    关注请求参数
     * @return 关注结果
     */
    Result<Void> followTarget(Long userId, FollowRequestDTO dto);

    /**
     * 取消关注
     *
     * @param userId 用户ID
     * @param dto    取消关注请求参数
     * @return 取消关注结果
     */
    Result<Void> unfollowTarget(Long userId, FollowRequestDTO dto);
    
    /**
     * 获取用户关注列表
     *
     * @param userId 用户ID
     * @param page   页码
     * @param size   每页大小
     * @return 分页的关注列表
     */
    Result<PageResult<FollowInfoDTO>> getFollowing(Long userId, int page, int size);

    /**
     * 获取用户粉丝列表
     *
     * @param userId 用户ID
     * @param page   页码
     * @param size   每页大小
     * @return 分页的粉丝列表
     */
    Result<PageResult<FollowInfoDTO>> getFollowers(Long userId, int page, int size);

    UserBasicInfo getUserBasicInfo(Long userId);

    boolean existsById(Long userId);

    Map<Long, UserBasicInfo> getUsersBasicInfoBatch(List<Long> userIds);

    /**
     * 获取所有可用的会员类型信息
     *
     * @return 会员类型列表
     */
    Result<List<MembershipTypeResponseVO>> getMembershipTypes();

    /**
     * 根据会员类型编码获取会员详情
     *
     * @param typeCode 会员类型编码
     * @return 会员类型详情
     */
    Result<MembershipTypeDetailVO> getMembershipTypeDetail(String typeCode);
}